/*
    *@brief			        :pthread_setcancelstate()函数会将调用线程的取消性状态设置为参数 state 中给定的值，
                            并将线程之前的取消性状态保存在参数 oldstate 指向的缓冲区中， 如果对之前的状态不感兴趣， Linux 允许将参数 oldstate 设置为 NULL；

    *@param[type]	        :PTHREAD_CANCEL_DEFERRED： 取消请求到来时，线程还是继续运行，取消请求被挂起，直到线程到达某个取消点（cancellation point，将在 11.6.3 小节介绍） 为止，这是所有新建线程包括主线程默认的取消性类型。
                            PTHREAD_CANCEL_ASYNCHRONOUS： 可能会在任何时间点（也许是立即取消，但不一定）取消线程，这种取消性类型应用场景很少， 不再介绍！

    *@param[oldstate]       :指向的缓冲区中， 如果对之前的状态不感兴趣， Linux 允许将参数 oldstate 设置为 NULL；

    *@return		        :成功返回 0；失败将返回错误码。
*/
// int pthread_setcanceltype(int type, int *oldstate);

#include <stdio.h>
#include <pthread.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <string.h>

static void *new_thread_start(void *arg)
{
	puts("新线程设置为取消点到来时取消，也就是调用sleep函数puts函数等");


    pthread_setcanceltype(PTHREAD_CANCEL_DEFERRED,NULL);

	for (;;)
    {
		puts("新线程死循环执行");
        sleep(2);
    }

	return (void *)0;
}

int main(void)
{
	pthread_t tid;
	void *tret;
	int ret;

	//申请一个线程
	ret = pthread_create(&tid, NULL, new_thread_start, NULL);
	if (ret)
	{
		fprintf(stderr, "pthread_create error:%s\n", strerror(ret));
		exit(-1);
	}

	//取消一个线程
	ret = pthread_cancel(tid);
	if (ret)
	{
		fprintf(stderr, "pthread_cancel error:%s\n", strerror(ret));
		exit(-1);
	}

	//回收一个线程
	ret = pthread_join(tid, &tret);
	if (ret)
	{
		fprintf(stderr, "pthread_join error:%s\n", strerror(ret));

		exit(-1);
	}

	printf("新线程终止, code=%ld\n", (long)tret);

	exit(0);
}